/**
 * 获取当前日期
 * @param format
 * @returns {string}
 */
function getCurrentDate(shift = 0, format = 'YYYY-MM-dd') {
    let dateItem = new Date();
    dateItem.setTime(new Date().getTime() + shift * 24 * 3600 * 1000);
    let dateSeparator = '-';
    let timeSeparator = ':';
    let year = dateItem.getFullYear();
    let month = dateItem.getMonth() + 1 <= 9 ? `0${dateItem.getMonth() + 1}` : dateItem.getMonth() + 1;
    let day = dateItem.getDate() <= 9 ? `0${dateItem.getDate()}` : dateItem.getDate();
    let hour = dateItem.getHours() <= 9 ? `0${dateItem.getHours()}` : dateItem.getHours();
    let minute = dateItem.getMinutes() <= 9 ? `0${dateItem.getMinutes()}` : dateItem.getMinutes();
    let second = dateItem.getSeconds() <= 9 ? `0${dateItem.getSeconds()}` : dateItem.getSeconds();
    if (format === 'YYYY-MM-dd') {
        return `${year}${dateSeparator}${month}${dateSeparator}${day}`;
    } else if (format === 'YYYY-MM-dd HH:mm:ss') {
        return `${year}${dateSeparator}${month}${dateSeparator}${day} ${hour}${timeSeparator}${minute}${timeSeparator}${second}`;
    } else {
        return `${year}${dateSeparator}${month}${dateSeparator}${day}`;
    }
}

function getDateNew(param) {
    if (isNaN(param)) {
        param = 0;
    }
    var curDate = new Date();
    var newDate = new Date(curDate);
    newDate.setDate(curDate.getDate() + param);
    var year = newDate.getFullYear();
    var month = newDate.getMonth() + 1 < 10 ? '0' + (newDate.getMonth() + 1) : newDate.getMonth() + 1;
    var date = newDate.getDate() < 10 ? '0' + newDate.getDate() : newDate.getDate();
    var separator = '-';
    return year + separator + month + separator + date;
}

/**
 * 获取当月最后一天
 * @param date
 */
function getLastDate(date) {
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = new Date(year, month, 0).getDate();
    return `${year}-${month < 10 ? ('0' + month) : month}-${day}`;
}

/**
 * 获取当月第一天
 * @param date
 * @returns {string}
 */
function getFirstDate(date) {
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = new Date(year, month, 1).getDate();
    return `${year}-${month < 10 ? ('0' + month) : month}-${day}`;
}

/**
 * 自动生成按钮
 * @param parentEle
 * @param buttonArray
 */
function buttonGen(parentEle, buttonArray = []) {
    let permissions = JSON.parse(localStorage.getItem('XZY_USER_PERMISSIONS')) || [];
    let menuId = $('body').data('menu_id');
    for (let i of buttonArray) {
        // if (i.text.indexOf('新增') >= 0) {
        //     i.disabled = permissions.indexOf(menuId + ':ADD') == -1;
        // }
        if (i.text.indexOf('修改') >= 0) {
            i.disabled = permissions.indexOf(menuId + ':MODIFY') == -1;
        }
        if (i.text.indexOf('删除') >= 0) {
            i.disabled = permissions.indexOf(menuId + ':DELETE') == -1;
        }
        if (i.text.indexOf('导出') >= 0) {
            i.disabled = permissions.indexOf(menuId + ':EXPORT') == -1;
        }
        if (i.text.indexOf('打印') >= 0) {
            i.disabled = permissions.indexOf(menuId + ':PRINT') == -1;
        }
        $(parentEle).append(`<a class="easyui-linkbutton" id="${i.id}" style="margin: 5px 1px 5px 5px"/>`);
        $(`#${i.id}`).linkbutton({...i})
    }
}

/**
 * 表单编辑
 * @param ele
 */
function enableFormEdit(ele) {
    $("input[textboxname]", ele).each(function (i, n) {
        $(n).textbox('enable');
    });
    $("input[switchbuttonname]", ele).each(function (i, n) {
        $(n).switchbutton('enable');
    });
    $(".easyui-linkbutton", ele).each(function (i, n) {
        if ($(n).linkbutton() != undefined) $(n).linkbutton('enable');
    });
    $(".easyui-checkbox", ele).each(function (i, n) {
        if ($(n).checkbox() != undefined) $(n).checkbox('enable');
    });
}

/**
 * 表单禁止编辑
 * @param ele
 */
function disableFormEdit(ele) {
    $("input[textboxname]", ele).each(function (i, n) {
        $(n).textbox('disable');
    });
    $("input[switchbuttonname]", ele).each(function (i, n) {
        $(n).switchbutton('disable');
    });
    $(".easyui-linkbutton", ele).each(function (i, n) {
        if ($(n).linkbutton() != undefined) $(n).linkbutton('disable');
    });
    $(".easyui-checkbox", ele).each(function (i, n) {
        if ($(n).checkbox() != undefined) $(n).checkbox('disable');
    });
}

/**
 * 封装序列化表单功能
 */
$.fn.serializeObject = function () {
    let o = {};
    let a = this.serializeArray();
    $.each(a, function () {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
}

/**
 * 将数组去重
 * @param arr
 * @param attribute
 * @returns {[]}
 */
function unique(arr, attribute) {
    let new_arr = [];
    let json_arr = [];
    for (let i = 0; i < arr.length; i++) {
        if (new_arr.indexOf(arr[i][attribute]) == -1) {
            new_arr.push(arr[i][attribute]);
            json_arr.push(arr[i]);
        }
    }
    return json_arr;
}

/**
 * 数组排序
 * @param arr
 * @param oldIndex
 * @param newIndex
 * @returns {*}
 */
function reorder1(arr, oldIndex, newIndex) {
    if (oldIndex == newIndex) return arr;
    if (oldIndex > newIndex) {
        arr.splice(newIndex, 0, arr[oldIndex])
        arr.splice(oldIndex + 1, 1);
    } else {
        arr.splice(newIndex, 0, arr[oldIndex]);
        arr.splice(oldIndex - 1, 1);
    }
    return arr;
}

/**
 * 2022年6月27日 10:14:05 弃用上面 reorder1 函数 - 原本张的方法
 * @param arr
 * @param oldIndex
 * @param newIndex
 * @returns {*}
 */
function reorder(arr, oldIndex, newIndex) {
    if (oldIndex == newIndex) return arr;
    const oldEle = {...arr[oldIndex]};
    const newEle = {...arr[newIndex]};

    arr[oldIndex] = {...newEle};
    arr[newIndex] = {...oldEle};
    return arr;
}

(function ($) {
    let cls = 'form-dialog-edit';
    $.formDialog = {
        open: function (option) {
            let columns = option.columns;
            let loadData = option['loadData'];
            let div = $(`<div class="${cls}"></div>`);
            let form = $('<form style="width: 100%;height: 100%;" method="post"></form>')
            for (let i of columns) {
                if (i['editor']) {
                    let options = i.editor.options;
                    let type = i.editor.type;
                    let input = $(`<div class="form-row"><label><b>${i.title}：</b></label><input name="${i.field}" class="easyui-${type}"></div>`);
                    if (i['id']) {
                        $(input).find('input').attr('id', i['id']);
                    }
                    $(input).find('input')[i.editor.type](options);
                    form.append(input);
                } else {
                    form.append(`<div class="form-row hidden"><label><b>${i.title}：</b></label><input name="${i.field}"></div>`);
                }
            }
            div.append(form);
            div.appendTo($('body'));
            $(`.${cls}`).dialog({
                iconCls: 'icon-edit',
                width: option['width'] ? option['width'] : 400,
                height: option['height'] ? option['height'] : '99%',
                maxHeight: 900,
                modal: true,
                resizable: true,
                title: option['mode'] ? option['mode'] : '新增',
                closed: false,
                onClose: function () {
                    $(this).dialog('destroy');
                },
                buttons: option['buttons'] ? option['buttons'] : [{
                    text: option['cancelText'] || '取消',
                    iconCls: option['cancelIconCls'] || 'icon-cancel', handler: option['onCancel']
                }, {
                    text: option['okText'] || '保存',
                    iconCls: option['okIconCls'] || 'icon-save',
                    handler: option['onSave']
                }],
                onOpen: function () {
                    if (loadData) {
                        $(this).find('form').form('load', loadData);
                    }
                }
            })
        },
        close: function () {
            $(`.${cls}`).dialog('close');
        }
    };
})(jQuery);

(function ($) {
    $.extend({
        dateFormat: function (str) {
            if (!str) return str;
            let reg = /\d{4}\D\d{1,2}\D\d{1,2}/g;
            let result = str.match(reg);
            if (result && result.length > 0) {
                let res = result[0].split(/\D/g);
                for (let i = 0; i < res.length; i++) {
                    if (i > 0) {
                        if (res[i] <= 9) {
                            res[i] = `0${res[i]}`;
                        }
                    }
                }
                return res.join('-');
            }
            return str;
        }
    })
})(jQuery);

/**
 * 更改参数配置
 */
(function ($) {
    $.fn.combobox.defaults.delay = 500;
})(jQuery);

/**
 * 警告弹窗
 * @param message
 */
function messageAlertWarning(message) {
    $.messager.alert('提示', message, 'warning');
}
/**
 * 错误弹窗
 * @param message
 */
function messageAlertError(message) {
    $.messager.alert('提示', message, 'error');
}

/**
 * 2021年8月1日 13:48:57 chanchaw
 * 将传入数据转换为 float 类型，如果传入
 * 了非数字的数据则返回0
 */
function convert2Float(strVal){
    if( strVal == undefined || strVal == null || strVal == "" ) return 0;
    if( isNaN(strVal) ) return 0;

    return parseFloat(strVal);
}

/**
 * 2021年8月17日 11:17:44 chanchaw
 * 获取指定ID的 kendoGrid 的选中行的数据
 * @param gridId
 */
function getKendoGridSelectedRowData(gridId){
    const kendoGrid = $(`#${gridId}`).data("kendoGrid");
    if( !kendoGrid ) return null;
    const selectedRows = kendoGrid.select();
    if( !selectedRows ) return null;

    let ret = [];
    let selected = Array.from(selectedRows);
    selected.forEach(ele => {
        let data = kendoGrid.dataItem(ele);
        ret.push(data);
    })

    return ret;
}

/**
 * 2021年9月27日 16:38:54 chanchaw
 * @param gridId 表格控件的 id
 * @returns {[]} 返回数据数组 - 非 kendoGrid 行数组
 */
function getKendoGridAllRowData(gridId){
    if(!gridId) {
        alert('没有传入表格ID');
        return;
    }
    const kendoGrid = $(`#${gridId}`).data("kendoGrid");
    let rows = $(`#${gridId}`).data('kendoGrid').dataSource.data();
    let ret = [];
    rows.forEach(ele => {
        let data = kendoGrid.dataItem(ele);
        ret.push(data);
    })

    return ret;
}

/**
 * 2021年11月3日 16:38:48 chanchaw
 * 获取过滤后的数据
 * @param gridId
 */
function getKendoGridFilterData(gridId){
    if(!gridId) {
        alert('没有传入表格ID');
        return;
    }
    let dataSource = $(`#${gridId}`).data('kendoGrid').dataSource;
    let filters = dataSource.filter();
    let allData = dataSource.data();
    let filterSource = new kendo.data.Query(allData);
    let filterData = filterSource.filter(filters).data;
    return filterData;
}

/**
 * 修改满足条件的行的文字颜色或者背景颜色
 * @param gridId kendoGrid 控件的 id
 * @param fieldName 行的字段名称
 * @param value 字段满足的条件
 * @param fontColor 文字颜色，不设置则不会修改颜色
 * @param backgroudColor 行背景色，不设置则不会修改颜色
 */
function changeKendoGridColor(gridId,fieldName,value,fontColor,backgroudColor){
    let kGrid = $(`#${gridId}`).data('kendoGrid');
    let gridRows = kGrid.tbody.find("tr");
    gridRows.each(function (i, row) {
        var data = kGrid.dataItem(row);
        if( data[fieldName] == value ){// 指定的属性满足某个条件则修改背景色
            if( fontColor ) // 修改文字颜色
                $(row).css("color", fontColor);
            if( backgroudColor ) // 修改背景色
                $(row).css("background-color", backgroudColor);
        }
    })
}

/**
 * 2021年11月22日 14:24:20 chanchaw
 * 刷新 kendo ui grid 表格数据
 */
function refreshKendoGrid(gridId){

}

function printLog(logContent){
    let logString = '';
    if( logContent )
        logString = new Date().format('yyyy-MM-dd HH:mm:ss.S') + " - " + logContent;
    else
        logString = new Date().format('yyyy-MM-dd HH:mm:ss.S');
    console.log(logString);
}

/**
 * 2021年11月12日 10:19:32 chanchaw
 * 获取 easyui grid 选中行
 * @param gridId easyui grid id
 */
function getEasyGridSelectedRows(gridId){
    const selectedRows = $(`#gridId`).datagrid('getSelections');
    return selectedRows;
}

/**
 * 2021年11月22日 14:23:34 chanchaw
 * 没有测试
 * @param gridId
 */
function refreshEasyGrid(gridId){
    $(`#gridId`).datagrid('reload');
}

// 弹出提示 - 右下角弹出提示
function msg(tip){
    $.messager.show({
        title: '提示',
        msg: tip
    });
}

function warnning(tip){
    $.messager.alert('提示', tip, 'warning');
}

// 检测单据日期是否当前并保存
function checkBillDateAndSave(billDate,saveFunc){
    const url = `system/checkBillDate`;
    $.ajax({
        type : "POST",
        contentType: "application/json;charset=UTF-8",
        data:JSON.stringify({"billDate":billDate}),
        url : url,
        success : function(res) {
            // 没有相应或者相应为空则执行保存单据逻辑
            if(!res){
                saveFunc();
                return;
            }

            const data = res.data;
            if(!data)// 后台返回了 false 表示需要用户确认
                $.messager.confirm('确认', '即将保存的日期不是当天的日期，您确定要继续吗？', function (r) {
                    if (r) {
                        saveFunc();
                    }
                })
            else
                saveFunc();
        },
        error : function(e){
            console.log(e.status);
            console.log(e.responseText);
        },
        complete: function () {
        }
    })
}

Date.prototype.format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "H+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}


$.request = (function () {
    var apiMap = {};
    function request(queryStr) {
        var api = {};
        if (apiMap[queryStr]) { return apiMap[queryStr]; }
        api.queryString = (function () {
            var urlParams = {};
            var e,
                d = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); },
                q = queryStr.substring(queryStr.indexOf('?') + 1),
                r = /([^&=]+)=?([^&]*)/g;
            while (e = r.exec(q))     urlParams[d(e[1])] = d(e[2]);
            return urlParams;
        })();
        api.getUrl = function () {
            var url = queryStr.substring(0, queryStr.indexOf('?') + 1);
            for (var p in api.queryString) { url += p + '=' + api.queryString[p] + "&";        }
            if (url.lastIndexOf('&') == url.length - 1) { return url.substring(0, url.lastIndexOf('&')); }
            return url;
        }
        apiMap[queryStr] = api;
        return api;
    }
    $.extend(request, request(window.location.href));
    return request;
})();

/**
 * 判断是否null
 * @param data
 * 为空可自定义 val 值
 */
function isNull(data,val){
    return (data == "" || data == undefined || data == null || data == NaN) ? val : data;
}